package com.lachesis.molecule.common.dbquery;

import java.util.List;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.lachesis.molecule.common.model.ICrudGenericDAO;


/** 
 * @ClassName: PageQuery 
 * @Description: 用于执行分页查询的静态类 
 * @author shiwei.hu shiwei.hu@lacehsis-mh.com
 * @date 2017年10月31日 下午6:26:39 
 *  
 */
public final class PageQuery {

	
	/** 
	 * @Title: queryAll 
	 * @Description: 与MBG集成，支持数据表的selectAll分页查询 
	 * @param @param mapper MyBatis 数据库Mapper接口
	 * @param @param args 分页查询参数
	 * @return PageQueryResult<T>    分布查询结果 
	 * @throws 
	 */
	public static <T> PageQueryResult<T> queryAll(final ICrudGenericDAO<?, T> mapper, PageQueryArgs args)
	{
		return queryBy(new IPageQueryProduce<T>() {

			@Override
			public List<T> query() {

				return mapper.selectAll();
			}
		}, args);
	}

	
	/** 
	 * @Title: queryByBean 
	 * @Description: TODO(这里用一句话描述这个方法的作用) 
	 * @param @param mapper
	 * @param @param bean
	 * @param @param args
	 * @return PageQueryResult<T>    返回类型 
	 * @throws 
	 */
	public static <T> PageQueryResult<T> queryByBean(final ICrudGenericDAO<?, T> mapper, final T bean, PageQueryArgs args)
	{
		return queryBy(new IPageQueryProduce<T>() {

			@Override
			public List<T> query() {

				return mapper.selectByBean(bean);
			}
		}, args);
	}
		
	
	/** 
	 * @Title: queryBy 
	 * @Description: TODO(这里用一句话描述这个方法的作用) 
	 * @param produce
	 * @param args
	 * @return    设定文件 
	 * @return PageQueryResult<T>    返回类型 
	 * @throws 
	 */
	public static <T> PageQueryResult<T> queryBy(IPageQueryProduce<T> produce, PageQueryArgs args)
	{
		PageQueryResult<T> result = new PageQueryResult<T>();

		try{
			Page<?> page = PageHelper.offsetPage(args.getOffset(), args.getNum(), args.isCountAll());
			PageHelper.orderBy(args.getOrderBy());			
			result.setQueryResult(produce.query());
			result.setTotalCnt(page.getTotal());
			return result;
		}
		finally {

			PageHelper.clearPage();
		}
	}

}
